
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

/**
 * AUTO-GENERATED FILE. DO NOT MODIFY.
 */

// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
import { __extends } from 'tslib';
import * as zrUtil from 'zrender/lib/core/util.js';
import Model from '../../model/Model.js';
import { isNameSpecified } from '../../util/model.js';
import ComponentModel from '../../model/Component.js';

var getDefaultSelectorOptions = function (ecModel, type) {
	if (type === 'all') {
		return {
			type: 'all',
			title: ecModel.getLocaleModel().get(['legend', 'selector', 'all'])
		};
	} else if (type === 'inverse') {
		return {
			type: 'inverse',
			title: ecModel.getLocaleModel().get(['legend', 'selector', 'inverse'])
		};
	}
};

var LegendModel =
/** @class */
function (_super) {
	__extends(LegendModel, _super);

	function LegendModel() {
		var _this = _super !== null && _super.apply(this, arguments) || this;

		_this.type = LegendModel.type;
		_this.layoutMode = {
			type: 'box',
			// legend.width/height are maxWidth/maxHeight actually,
			// whereas real width/height is calculated by its content.
			// (Setting {left: 10, right: 10} does not make sense).
			// So consider the case:
			// `setOption({legend: {left: 10});`
			// then `setOption({legend: {right: 10});`
			// The previous `left` should be cleared by setting `ignoreSize`.
			ignoreSize: true
		};
		return _this;
	}

	LegendModel.prototype.init = function (option, parentModel, ecModel) {
		this.mergeDefaultAndTheme(option, ecModel);
		option.selected = option.selected || {};

		this._updateSelector(option);
	};

	LegendModel.prototype.mergeOption = function (option, ecModel) {
		_super.prototype.mergeOption.call(this, option, ecModel);

		this._updateSelector(option);
	};

	LegendModel.prototype._updateSelector = function (option) {
		var selector = option.selector;
		var ecModel = this.ecModel;

		if (selector === true) {
			selector = option.selector = ['all', 'inverse'];
		}

		if (zrUtil.isArray(selector)) {
			zrUtil.each(selector, function (item, index) {
				zrUtil.isString(item) && (item = {
					type: item
				});
				selector[index] = zrUtil.merge(item, getDefaultSelectorOptions(ecModel, item.type));
			});
		}
	};

	LegendModel.prototype.optionUpdated = function () {
		this._updateData(this.ecModel);

		var legendData = this._data; // If selectedMode is single, try to select one

		if (legendData[0] && this.get('selectedMode') === 'single') {
			var hasSelected = false; // If has any selected in option.selected

			for (var i = 0; i < legendData.length; i++) {
				var name_1 = legendData[i].get('name');

				if (this.isSelected(name_1)) {
					// Force to unselect others
					this.select(name_1);
					hasSelected = true;
					break;
				}
			} // Try select the first if selectedMode is single

			!hasSelected && this.select(legendData[0].get('name'));
		}
	};

	LegendModel.prototype._updateData = function (ecModel) {
		var potentialData = [];
		var availableNames = [];
		ecModel.eachRawSeries(function (seriesModel) {
			var seriesName = seriesModel.name;
			availableNames.push(seriesName);
			var isPotential;

			if (seriesModel.legendVisualProvider) {
				var provider = seriesModel.legendVisualProvider;
				var names = provider.getAllNames();

				if (!ecModel.isSeriesFiltered(seriesModel)) {
					availableNames = availableNames.concat(names);
				}

				if (names.length) {
					potentialData = potentialData.concat(names);
				} else {
					isPotential = true;
				}
			} else {
				isPotential = true;
			}

			if (isPotential && isNameSpecified(seriesModel)) {
				potentialData.push(seriesModel.name);
			}
		});
		/**
     * @type {Array.<string>}
     * @private
     */

		this._availableNames = availableNames; // If legend.data is not specified in option, use availableNames as data,
		// which is convenient for user preparing option.

		var rawData = this.get('data') || potentialData;
		var legendNameMap = zrUtil.createHashMap();
		var legendData = zrUtil.map(rawData, function (dataItem) {
			// Can be string or number
			if (zrUtil.isString(dataItem) || zrUtil.isNumber(dataItem)) {
				dataItem = {
					name: dataItem
				};
			}

			if (legendNameMap.get(dataItem.name)) {
				// remove legend name duplicate
				return null;
			}

			legendNameMap.set(dataItem.name, true);
			return new Model(dataItem, this, this.ecModel);
		}, this);
		/**
     * @type {Array.<module:echarts/model/Model>}
     * @private
     */

		this._data = zrUtil.filter(legendData, function (item) {
			return !!item;
		});
	};

	LegendModel.prototype.getData = function () {
		return this._data;
	};

	LegendModel.prototype.select = function (name) {
		var selected = this.option.selected;
		var selectedMode = this.get('selectedMode');

		if (selectedMode === 'single') {
			var data = this._data;
			zrUtil.each(data, function (dataItem) {
				selected[dataItem.get('name')] = false;
			});
		}

		selected[name] = true;
	};

	LegendModel.prototype.unSelect = function (name) {
		if (this.get('selectedMode') !== 'single') {
			this.option.selected[name] = false;
		}
	};

	LegendModel.prototype.toggleSelected = function (name) {
		var selected = this.option.selected; // Default is true

		if (!selected.hasOwnProperty(name)) {
			selected[name] = true;
		}

		this[selected[name] ? 'unSelect' : 'select'](name);
	};

	LegendModel.prototype.allSelect = function () {
		var data = this._data;
		var selected = this.option.selected;
		zrUtil.each(data, function (dataItem) {
			selected[dataItem.get('name', true)] = true;
		});
	};

	LegendModel.prototype.inverseSelect = function () {
		var data = this._data;
		var selected = this.option.selected;
		zrUtil.each(data, function (dataItem) {
			var name = dataItem.get('name', true); // Initially, default value is true

			if (!selected.hasOwnProperty(name)) {
				selected[name] = true;
			}

			selected[name] = !selected[name];
		});
	};

	LegendModel.prototype.isSelected = function (name) {
		var selected = this.option.selected;
		return !(selected.hasOwnProperty(name) && !selected[name]) && zrUtil.indexOf(this._availableNames, name) >= 0;
	};

	LegendModel.prototype.getOrient = function () {
		return this.get('orient') === 'vertical' ? {
			index: 1,
			name: 'vertical'
		} : {
			index: 0,
			name: 'horizontal'
		};
	};

	LegendModel.type = 'legend.plain';
	LegendModel.dependencies = ['series'];
	LegendModel.defaultOption = {
		// zlevel: 0,
		z: 4,
		show: true,
		orient: 'horizontal',
		left: 'center',
		// right: 'center',
		top: 0,
		// bottom: null,
		align: 'auto',
		backgroundColor: 'rgba(0,0,0,0)',
		borderColor: '#ccc',
		borderRadius: 0,
		borderWidth: 0,
		padding: 5,
		itemGap: 10,
		itemWidth: 25,
		itemHeight: 14,
		symbolRotate: 'inherit',
		symbolKeepAspect: true,
		inactiveColor: '#ccc',
		inactiveBorderColor: '#ccc',
		inactiveBorderWidth: 'auto',
		itemStyle: {
			color: 'inherit',
			opacity: 'inherit',
			borderColor: 'inherit',
			borderWidth: 'auto',
			borderCap: 'inherit',
			borderJoin: 'inherit',
			borderDashOffset: 'inherit',
			borderMiterLimit: 'inherit'
		},
		lineStyle: {
			width: 'auto',
			color: 'inherit',
			inactiveColor: '#ccc',
			inactiveWidth: 2,
			opacity: 'inherit',
			type: 'inherit',
			cap: 'inherit',
			join: 'inherit',
			dashOffset: 'inherit',
			miterLimit: 'inherit'
		},
		textStyle: {
			color: '#333'
		},
		selectedMode: true,
		selector: false,
		selectorLabel: {
			show: true,
			borderRadius: 10,
			padding: [3, 5, 3, 5],
			fontSize: 12,
			fontFamily: 'sans-serif',
			color: '#666',
			borderWidth: 1,
			borderColor: '#666'
		},
		emphasis: {
			selectorLabel: {
				show: true,
				color: '#eee',
				backgroundColor: '#666'
			}
		},
		selectorPosition: 'auto',
		selectorItemGap: 7,
		selectorButtonGap: 10,
		tooltip: {
			show: false
		}
	};
	return LegendModel;
}(ComponentModel);

export default LegendModel;